package com.taoge.p4.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class ThreadPoolConfig {
    private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();

    @Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数：始终存活的线程，空闲状态也不会被销毁
        // CPU的核数可以做为线程数量的参考
        // 如果运行时的线程数超过了CPU的核数，会发生线程的上下文切换
        executor.setCorePoolSize(CORE_POOL_SIZE == 0 ? 4 : CORE_POOL_SIZE);
        // 最大线程数：线程池中允许创建的线程数量最大值
        // 如果执行的线程超过了最大线程数，会进入等待队列
        executor.setMaxPoolSize(executor.getCorePoolSize() * 2);
        // 队列数量：当所有线程都占满后，再来任务，会放到等待队列中
        // 如果队列满了，再有任务会执行拒绝策略
        executor.setQueueCapacity(100);
        // 最大空闲时间，超过空闲时间后，会回收线程（最低保留 CorePoolSize 数量）
        executor.setKeepAliveSeconds(60);
        // 线程前缀
        executor.setThreadNamePrefix("productBrowseThreadPool - ");
        executor.initialize();
        return executor;
    }
}
